/*
 * To change this template, choose Tools | Templates
 * and open the template in the editor.
 */
package modele;

import exception.CombinaisonInconnue;
import exception.ScoreAvantLancerException;
import java.util.List;
import java.util.Map;

/**
 * Interface YAMS qui regroupe les méthodes que doivent implémenter tous modèle
 * prétendant être le modele du jeu
 * @author Florian MININ & Khémon BEH
 */
public interface ModeleYamsInterface {

    /**
     * Méthode qui retourne le joueur a qui c'est le tour 
     * @return
     */
    public AbstractJoueur aQuiLeTour();

    /**
     * Ajoute les joueurs au jeu
     * @param j1
     * @param j2
     */
    public void ajouteJoueurs(AbstractJoueur j1, AbstractJoueur j2);
    
    /**
     * Méthode qui retourne le joueur actuel
     * @return
     */
    public AbstractJoueur getJoueurActuel();

    /**
     * Méthode qui permet de jeter les dés
     * @return
     */
    public List<Integer> jetteDes();
    /*
     * Méthode qui permet de mettre à jour la map de combinaison et de sélectionné
     * Elle est appelée par le controleur
     * @param i
     * @return
     */

    public void selectDe(int i);

    /**
     * Selectionne le de passé en paramètre
     * Elle est appelée par le l'IA
     * @param de Dé a selectionner
     */
    public void selectionneDe(De de);
    /*
     *
     * @param i
     * @return true si le dé peut être déselectionné, false sinon
     */

    public boolean deselectDe(int i);

    /**
     * Déselectionne le dé passé en paramètre
     * Méthode appelée par l'IA
     * @param de Dé a deselectionner
     */
    public void deSelectionneDe(De de);

    /**
     * Calcule combien peuvent rapporter en point chaque combinaison
     */
    public Map<String, Integer> calculScoreCombis();

    /**
     * Retourne vrai si le dé n'a pas été choisi, faux sinon
     * @param i
     * @return boolean
     */
    public boolean estDispo(int i);

    /**
     * Retourn le nombre de lancer de dés restant
     * @return int
     */
    public int getNbLanceDesRestant();

    /**
     * Méthode qui met à jour le score de la combinaison sélectionné par
     * l'utilisateur.
     */
    public int enregistreScoreTour(String combinaison) throws CombinaisonInconnue, ScoreAvantLancerException;

    /**
     * Retourne la valeur du dé dont le numéro est passé
     * en paramètre
     * @param numDes Numéro du dé
     * @return <tt>int</tt> correspondant a la valeur du dé.
     */
    public int getValeurDes(int numDes);

    /**
     * Retourne les dés lancés
     * @return la liste de dés.
     */
    public List<De> getDes();

    /**
     * Méthode qui retourne le code joueur de celui qui a le plus de point, si les deux
     * joueurs sont à égalité il retourne null
     */
    public AbstractJoueur getLeader();
}
